package com.demo.test.leak;


import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.fortest.R;

/**
 泄露方式：静态变量引用非静态的内部类对象
 泄露原因： 静态变量存储在方法区，他的生命周期从类加载开始，到整个进程结束，一旦静态变量初始化，他所持有的引用只有等到进程结束才会释放；
 本例中，静态变量sHello持有Hello的引用，而 Hello是一个非静态的内部类，所以它必然会持有外部类即 ActivityLeakC.this引用，
 如果sHello没有static的修饰，那么当退出这个Activity后，sHello的生命周期也就结束了，Activity也不会被引用着。

 泄露报告　－－　LeakCanary：
 78260 bytes retained by leaking objects
 Signature: 3dd99e63a6682f9f5cbf7723d6263e604a76b1
 ┬───
 │ GC Root: System class
 │
 ├─ com.demo.test.leak.ActivityLeakC_StaticVariable2 class
 │    Leaking: NO (a class is never leaking)
 │    ↓ static ActivityLeakC_StaticVariable2.sHello
 │                                           ~~~~~~
 ├─ com.demo.test.leak.ActivityLeakC_StaticVariable2$Hello instance
 │    Leaking: UNKNOWN
 │    ↓ ActivityLeakC_StaticVariable2$Hello.this$0
 │                                          ~~~~~~
 ╰→ com.demo.test.leak.ActivityLeakC_StaticVariable2 instance
 ​     Leaking: YES (ObjectWatcher was watching this because com.demo.test.leak.ActivityLeakC_StaticVariable2 received Activity#onDestroy() callback and Activity#mDestroyed is true)
 ​     key = ae1e3807-86c7-4e25-9fe8-a503984aaba1
 ​     watchDurationMillis = 5164
 ​     retainedDurationMillis = 151
 **/
public class ActivityLeakC_StaticVariable2 extends AppCompatActivity {


    private static Hello sHello;//静态变量定义


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_leak_common);
        TextView textView=  findViewById(R.id.helper_text);
        textView.setText("泄露方式：静态变量引用非静态的内部类对象\n" +
                " 泄露原因： 静态变量存储在方法区，他的生命周期从类加载开始，到整个进程结束，一旦静态变量初始化，他所持有的引用只有等到进程结束才会释放；\n" +
                " 本例中，静态变量sHello持有Hello的引用，而 Hello是一个非静态的内部类，所以它必然会持有外部类即 ActivityLeakC.this引用，\n" +
                " 如果sHello没有static的修饰，那么当退出这个Activity后，sHello的生命周期也就结束了，Activity也不会被引用着。");
        sHello = new Hello();//静态变量赋值，初始化
        sHello.show();
    }


    public class Hello {
        void show() {
            Log.d("", "Hello");
        }
    }


}
